Маятник Петра
g = 9.81;
m1 = 1; m2 = 1; m3 = 1;
l1 = 1; l2 = 1; l3 = 1;
timeMax = 30;
eqns = {
(m1 + m2 + m3) l1^2 \[Theta]1''[t] + (m2 + m3) l1 l2 \[Theta]2''[t] Cos[\[Theta]1[t] - \[Theta]2[t]] +
m3 l1 l3 \[Theta]3''[t] Cos[\[Theta]1[t] - \[Theta]3[t]] +
(m2 + m3) l1 l2 \[Theta]2'[t]^2 Sin[\[Theta]1[t] - \[Theta]2[t]] +
m3 l1 l3 \[Theta]3'[t]^2 Sin[\[Theta]1[t] - \[Theta]3[t]] +
g (m1 + m2 + m3) l1 Sin[\[Theta]1[t]] == 0,
(m2 + m3) l2^2 \[Theta]2''[t] + (m2 + m3) l1 l2 \[Theta]1''[t] Cos[\[Theta]1[t] - \[Theta]2[t]] +
m3 l2 l3 \[Theta]3''[t] Cos[\[Theta]2[t] - \[Theta]3[t]] -
(m2 + m3) l1 l2 \[Theta]1'[t]^2 Sin[\[Theta]1[t] - \[Theta]2[t]] +
m3 l2 l3 \[Theta]3'[t]^2 Sin[\[Theta]2[t] - \[Theta]3[t]] +
g (m2 + m3) l2 Sin[\[Theta]2[t]] == 0,
m3 l3^2 \[Theta]3''[t] + m3 l1 l3 \[Theta]1''[t] Cos[\[Theta]1[t] - \[Theta]3[t]] +
m3 l2 l3 \[Theta]2''[t] Cos[\[Theta]2[t] - \[Theta]3[t]] -
m3 l1 l3 \[Theta]1'[t]^2 Sin[\[Theta]1[t] - \[Theta]3[t]] -
m3 l2 l3 \[Theta]2'[t]^2 Sin[\[Theta]2[t] - \[Theta]3[t]] +
g m3 l3 Sin[\[Theta]3[t]] == 0
};
initCond = {
\[Theta]1[0] == \[Pi]/2 - 0.1,
\[Theta]2[0] == \[Pi],
\[Theta]3[0] == \[Pi],
\[Theta]1'[0] == 0,
\[Theta]2'[0] == 0,
\[Theta]3'[0] == 0
};
sol = NDSolve[{eqns, initCond}, {\[Theta]1, \[Theta]2, \[Theta]3}, {t, 0, timeMax}];
x1[t_] := l1 Sin[\[Theta]1[t] /. First[sol]];
y1[t_] := -l1 Cos[\[Theta]1[t] /. First[sol]];
x2[t_] := x1[t] + l2 Sin[\[Theta]2[t] /. First[sol]];
y2[t_] := y1[t] - l2 Cos[\[Theta]2[t] /. First[sol]];
x3[t_] := x2[t] + l3 Sin[\[Theta]3[t] /. First[sol]];
y3[t_] := y2[t] - l3 Cos[\[Theta]3[t] /. First[sol]];
trajectory = Table[{x3[t], y3[t]}, {t, 0, timeMax, 0.05}];
Module[{points, track}, Animate[
Graphics[
{
Thick, Black,
Line[{{0, 0}, points[[1]], points[[2]], points[[3]]} // Offload],
Blue, PointSize[0.03], Point[points[[1]] // Offload],
Red, PointSize[0.03], Point[points[[2]] // Offload],
Black, PointSize[0.04], Point[points[[3]] // Offload],
{Green, Opacity[0.5], Line[track // Offload ]}
},
PlotRange -> {{-3.5, 3.5}, {-3.5, 0.5}},
Axes -> True,
Background -> White,
ImageSize -> 500
],
{t, 0, timeMax, 0.05},
AnimationRate -> 30,
"UpdateFunction" -> Function[t,
track = trajectory[[ ;; Floor[t / 0.05] + 1]];
points = {{x1[t], y1[t]}, {x2[t], y2[t]}, {x3[t], y3[t]}};
False
]
] ]